/* Autor : Jannis Migdalas
Klasse : FI1.1
Dateiname : bridges_win.c
Datum : 10.05.2011
Beschreibung: Das Programm überprüft ob es einen Gewinner gibt
Version : 1.0
Programmschnittstelle:
int BridgesWinner(int iBoard[][17])
	1.Parameter: Spielfeld (2-dimensionales Array)
void fillEmpty(int iBoard[][17])
	1.Parameter: Spielfeld (2-dimensionales Array)
void setChecker(int x, int y,int iBoard[][17],int iMarked[][17],int iChecker)
	markiert alle Felder, die vom aktuellen Spieler erreichbar sind
	1.Parameter: X-Koordinate des markierten Feldes
	2.Parameter: X-Koordinate des markierten Feldes
	3.Parameter: Spielfeld (2-dimensionales Array)
	4.Parameter: Markiertes Feld
void fillEmpty(int iBoard[][17])
	befüllt das Spielfeld mit 0
	Parameter: Spielfeld
*/

#include <stdio.h>
#include "bridges_win.h"

//Funktion, die den Gewinner ermittelt, falls es einen gibt.
//Hierbei wird nur geschaut, ob es eine Verbindung zum Rand gibt und die aktuelle Position markiert
//wird ein Stein am anderen Rand markiert, gibt es einen Gewinner
int BridgesWinner(int iBoard[17][17]){
	
   int iChecker;
   int iRow = 0;
   int iCol = 0;
   int iVar = 0;
   int iMarked[17][17];
    
    
   fillEmpty(iMarked);
   //Markiert alle Brücken, die mit dem linken Rand verbunden sind
   iChecker = 1;
   for(iRow = 0; iRow < 17; iRow++){
      if(iBoard[iRow][0] == iChecker && iMarked[iRow][0] != 1){
         setChecker(iRow,0,iBoard,iMarked,iChecker);
      }
   }
   //kontrolliert ob der rechte Rand erreich wurde
   for(iRow = 0; iRow < 17; iRow++){
      if(iMarked[iRow][16] == 1){
         iVar = 1;
      }
   }
   if(iVar)
   {
      return 1;
   }
    
    
	//kontrolliert ob Spieler 1 gewonnen hat
   iVar = 0;
   fillEmpty(iMarked);
   //Markiert alle Feld, die mit dem oben Rand in Berührung stehen
   iChecker = -1;
   for(iCol = 0; iCol < 17; iCol++){
      if(iBoard[0][iCol] == iChecker && iMarked[0][iCol] != 1){
         setChecker(0,iCol,iBoard,iMarked,iChecker);
      }
   }
   //kontrolliert, ob ein Stein den untern Rand erreicht hat
   for(iCol = 0; iCol < 17; iCol++){
      if(iMarked[16][iCol] == 1){
         iVar = 1;
      }
   }
   if(iVar)
   {
      return -1;
   }
   return 0;
}

//füllt das Spielfeld mit 0 = unbesetzt
void fillEmpty(int iBoard[][17]){
   int i;
   int j;

	//setzt iterativ alle Felder des Arrays 0
   for(i = 0; i<17;i++){
      for(j = 0; j<17;j++){
         iBoard[i][j]=0;
      }
   }
}

//Alle Felder, die mit einer Brücke erreicht werden können, werden markiert
void setChecker(int x, int y,int iBoard[][17],int iMarked[][17],int iChecker){

   //Das Feld ist durch den Anderen User besetzt
   if(iBoard[x][y] != iChecker){
      return;
   }

   //Das Feld ist bereits markiert
   if(iMarked[x][y] == 1){
      return;
   }
    
   //Markiert das aktuelle Feld
   iMarked[x][y] = 1;
    
   //Folgend werde alle Felder horizontal und vertikal vom Aktuell markierten überprüft
   if(x > 0){
		setChecker(x-1,y,iBoard,iMarked,iChecker);
   }

   if(y > 0){
      setChecker(x,y-1,iBoard,iMarked,iChecker);
   }
    
   if(x < 16){
      setChecker(x+1,y,iBoard,iMarked,iChecker);
   }
    
   if(y < 16){
      setChecker(x,y+1,iBoard,iMarked,iChecker);
   }
   return;
}
